home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0256
/
mdebug1.exe
/
A86.TXT
< prev
next >
Wrap
Text File
|
1992-07-25
|
8KB
|
329 lines
Hinweise zur Konvertierung der A86-Quellcodes für andere Assembler
──────────────────────────────────────────────────────────────────
Diese Datei enthält eine kurze Beschreibung der A86-spezifischen Features,
die in den zu MDEBUG mitgelieferten Quelltexten benutzt werden.
- Quelltexte für den A86 müssen keinerlei 'Red tapes' enthalten
(z.B 'CODE SEGMENT ...', 'ASSUME ...', 'PROC NEAR', 'ENDP', etc.).
- Per Voreinstellung behandelt der A86 alle Konstanten ohne Formatangabe
als hexadezimal falls sie mit der Ziffer '0' beginnen und als dezimal
falls sie NICHT mit der Ziffer '0' beginnen.
Binäre Konstanten werden mit dem Suffix 'xB' gekennzeichnet.
Das Suffix 'h' kennzeichnet Konstanten explizit als hexadezimal und
das Suffix 'xD' kennzeichnet Konstanten explizit als dezimal.
Beispiele:
Konstante │ Format
──────────┼────────────
012 │ hexadezimal
0CC │ hexadezimal
300 │ dezimal
300h │ hexadezimal
011xB │ binär
044xD │ dezimal
- Falls keine 'PROC'-Anweisungen vorhanden sind, sind RET-Befehle immer
'RET NEAR'-Befehle. 'RET FAR'-Befehle müssen als 'RETF' kodiert werden.
- PUSH- und POP-Befehle können mehrere Operanden haben.
Beispiel:
push ax,bx,cx
wird übersetzt als
push ax
push bx
push cx
oder
pop ds,es
wird übersetzt als
pop ds
pop es
- INC- und DEC-Befehle können einen zweiten Operanden für die Anzahl
der Inkrementierungen bzw. Dekrementierungen haben.
Beispiel:
inc ax,2
wird übersetzt als
inc ax
inc ax
oder:
dec cx,3
wird übersetzt als
dec cx
dec cx
dec cx
- Zuweisungen von direkten Werten an Segment-Register sind möglich.
Beispiel:
mov ds,040h
wird übersetzt als
push ax
mov ax,040h
mov ds,ax
pop ax
- Zuweisungen der Form 'mov segreg,segreg' sind ebenfalls möglich.
Beispiel:
mov ds,cs
wird übersetzt als
push cs
pop ds
- Der A86 kennt lokale Bezeichner. Jeder Bezeichner, der mit einem
Buchstaben beginnt und dessen restliche Zeichen nur Ziffern sind,
ist ein lokaler Bezeichner.
Beispiele:
L001:
L4 EQU CR
T005 PROC NEAR
M1 MACRO db 0 #EM
Lokale Bezeichner können beliebig neu definiert werden.
Der A86 verwendet immer die gerade definierten Werte für einen
lokalen Bezeichner.
Beispiel:
L0 EQU 040h ; <──────────────────────────────────────┐
│
mov ax,l0 ; verwendet die EQU-Konstante L0 ─┘
mov bx,offset >l0 ; verwendet den Offset des Labels L0 ─┐
; (das Größerzeichen markiert eine │
; 'Forward'-Referenz!) │
;┌──────────────────────────────────────────────────────────┘
l0: ; <─────────────────────────────────────────┐
mov ax,4 ; │
jmp l0 ; springt zu diesem Label ─┘
cmp cx,4
je >l0 ; das Größerzeichen vor einem lokalen
; Label markiert eine 'Forward'-Referenz,
; d.h. der Befehl springt zu diesem
; Label ──┐
ret ; │
l0: ; <────────────────────────┘
- Forward-Referenzen sind, falls nichts anderes angegeben ist, immer
Referenzen auf Konstanten.
Beispiel:
mov ax,ByteOffset ; Falls 'ByteOffset' hier noch NICHT definiert
; ist, wird dieser Befehl vom A86 behandelt
; als
; 'MOV AX, Offset ByteOffset'
- Zur expliziten Angabe des Formats einer Variablen können die Buchstaben
B, W und D angegeben werden.
Beispiel:
MOV B[45h],12h entspricht: MOV BYTE PTR [45h],12h
MOV W[1234],0 entspricht: MOV WORD PTR [1234],0
LDS D[05678] entspricht: LDS DWORD PTR [05678]
- Der A86 erlaubt auch folgende Konstruktionen:
cmp ax,4
IF e jmp Ende
wird übersetzt als:
cmp ax,4
jne label1
jmp Ende
Label1:
oder:
cmp ax,4
IF ne mov ax,0
wird übersetzt als:
cmp ax,4
jne label1
mov ax,0
label1:
- Als Ziel für einen Sprung kann auch 'RET' angegeben werden.
Beispiel:
mov ax,4
jmp ret ; springt zum nächsten RET NEAR-Befehl
; (vorwärts oder zurück)
- Struktur-Definitionen können ein Basisregister haben.
Beispiel:
BSP_STRUC[BX]
Element1 dw ?
Element2 dw ?
ENDS
mov ax,Element1 ; wird übersetzt als 'mov ax,Element1[bx]'
mov Element2,cx ; wird übersetzt als 'mov Element2[bx],cx'
für andere Assembler muß das folgendermaßen kodiert werden:
BSP_STRUC
Element1 dw ?
Element2 dw ?
ENDS
mov ax,Element1[bx]
mov Element2[bx],cx
- 'db'-, 'dw'- und 'dd'-Anweisungen können auch OHNE Operanden angegeben
werden.
Sie werden dann wie die entsprechenden 'LABEL BYTE'-, 'LABEL WORD'-
bzw. 'LABEL DWORD'-Anweisungen behandelt.
Beispiel:
ThisDWord dd
ThisWord dw
ThisByte db
RealByte db 0
entspricht den Deklarationen:
ThisDWord LABEL DWORD
ThisWord LABEL WORD
ThisByte LABEL BYTE
RealByte db 0
- Zur Definition eines Wortes kann auch das Schlüsselwort BY verwendet
werden. BY dient zur Zusammenfassung von zwei Byte-Werten zu einem
Wort-Wert, wobei der erste Operand das Highbyte und der zweite Operand
das Lowbyte für das Wort darstellen.
Beispiel:
Version EQU 2 BY 1
entspricht der Definition:
Version EQU 201h
oder:
TestVar EQU 'X' BY 0
entspricht der Definition:
TestVar EQU 5800h
- Der A86 verwendet folgende Macro-Syntax:
MACRO name_des_macros
; Macro Text
#EM ; Endemarkierung für das Macro
Parameter für das Macro können im Macro-Text über die Konstanten
#1, #2 bis #9 angesprochen werden. Die Parameter werden als Text
übergeben (nicht als Wert!).
- Für die bedingte Kompilierung werden folgende Schlüsselwörter benutzt:
#IF bedingung
; Anweisungen, falls Bedingung TRUE
#ELSEIF bedingung
; Anweisungen, falls 2. Bedingung TRUE (weitere #ELSEIFs möglich)
#ELSE
; Anweisungen, falls keine vorherige Bedingung TRUE war
#ENDIF
Mögliche Bedingungen (u.a.):
op1 LT op2 TRUE, falls der 1. Operand kleiner als der zweite Operand ist
op1 GT op2 TRUE, falls der 1. Operand kleiner als der zweite Operand ist
op1 EQ op2 TRUE, falls der 1. Operand gleich dem zweiten Operanden ist
op1 NE op2 TRUE, falls der 1. Operand nicht gleich dem zweiten Operanden ist
Bedingungen der Form '!konstanten_name' sind TRUE, falls die Konstante
noch NICHT deklariert ist.
Beispiel:
#IF !ENGLISCH
db 'Deutsche Meldung' ; Konstante Englisch ist nicht
; definiert
#ELSE
db 'English message' ; Konstante Englisch ist
; definiert
#ENDIF
Falls Anweisungen zur bedingten Kompilierung in Macros übernommen
werden sollen (d.h. sie sollen erst beim Aufruf des Macros ausgewertet
werden), müssen die Schlüsselwörter für die bedingte Kompilierung
mit zwei Nummernzeichen beginnen.